home *** CD-ROM | disk | FTP | other *** search
/ PC Media 20 / PC MEDIA CD20.iso / share / soni / it202 / ittech.doc < prev    next >
Text File  |  1996-04-26  |  22KB  |  466 lines

  1.  
  2.                              Impulse Header Layout
  3.  
  4.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  5.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  6. 0000: │'I'│'M'│'P'│'M'│ Song Name, max 26 characters, includes NULL   │
  7.       ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤
  8. 0010: │.......................................................│ x │ x │
  9.       ├───────┬───────┬───────┬───────┬───────┬───────┬───────┼───┴───┤
  10. 0020: │OrdNum │InsNum │SmpNum │PatNum │ Cwt/v │ Cmwt  │ Flags │Special│
  11.       ├───┬───┼───┬───┼───┬───┼───────┼───────┴───────┼───┬───┼───┬───┤
  12. 0030: │GV │MV │IS │IT │Sep│(0)│MsgLgth│Message Offset │ x │ x │ x │ x │
  13.       ├───┴───┴───┴───┴───┴───┴───────┴───────────────┴───┴───┴───┴───┤
  14. 0040: │ Chnl Pan (64 bytes)...........................................│
  15.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  16.  
  17.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  18. 0080: │ Chnl Vol (64 bytes)...........................................│
  19.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  20.  
  21.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  22. 00C0: │ Orders, Length = OrdNum                                       │
  23.       ├───────────────────────────────────────────────────────────────┤
  24. xxxx: │ 'Long' Offset of instruments, Length = InsNum*4 (1)           │
  25.       ├───────────────────────────────────────────────────────────────┤
  26. xxxx: │ 'Long' Offset of samples headers, Length = SmpNum*4 (2)       │
  27.       ├───────────────────────────────────────────────────────────────┤
  28. xxxx: │ 'Long' Offset of patterns, Length = PatNum*4 (3)              │
  29.       └───────────────────────────────────────────────────────────────┘
  30.  
  31.       (1) Offset = 00C0h+OrdNum
  32.       (2) Offset = 00C0h+OrdNum+InsNum*4
  33.       (3) Offset = 00C0h+OrdNum+InsNum*4+SmpNum*4
  34.  
  35.         Note that if the (long) offset to a pattern = 0, then the
  36.         pattern is assumed to be a 64 row empty pattern.
  37.  
  38.       Cwt:      Created with tracker.
  39.                  Impulse Tracker y.xx = 0yxxh
  40.       Cmwt:     Compatible with tracker with version greater than value.
  41.                  (ie. format version)
  42.       OrdNum:   Number of orders in song.
  43.       InsNum:   Number of instruments in song
  44.       SmpNum:   Number of samples in song
  45.       PatNum:   Number of patterns in song
  46.       Flags:    Bit 0: On = Stereo, Off = Mono
  47.                 Bit 1: Vol0MixOptimizations - If on, no mixing occurs if
  48.                        the volume at mixing time is 0 (redundant v1.04+)
  49.                 Bit 2: On = Use instruments, Off = Use samples.
  50.                 Bit 3: On = Linear slides, Off = Amiga slides.
  51.                 Bit 4: On = Old Effects, Off = IT Effects
  52.                         Differences:
  53.                        - Vibrato is updated EVERY frame in IT mode, whereas
  54.                           it is updated every non-row frame in other formats.
  55.                           Also, it is two times deeper with Old Effects ON
  56.                        - Command Oxx will set the sample offset to the END
  57.                          of a sample instead of ignoring the command under
  58.                          old effects mode.
  59.                        - (More to come, probably)
  60.  
  61.       Special:  Bit 0: On = song message attached.
  62.                        Song message:
  63.                         Stored at offset given by "Message Offset" field.
  64.                         Length = MsgLgth.
  65.                         NewLine = 0Dh (13 dec)
  66.                         EndOfMsg = 0
  67.  
  68.                        Note: v1.04+ of IT may have song messages of up to
  69.                              8kb included.
  70.  
  71.                 Bits 1-15: Undefined.
  72.  
  73.       GV:       Global volume. (0->128) All volumes are adjusted by this
  74.       MV:       Mix volume (0->128) During mixing, this value controls
  75.                 the magnitude of the wave being mixed.
  76.       IS:       Initial Speed of song.
  77.       IT:       Initial Tempo of song
  78.       Sep:      Panning separation between channels (0->128, 128 is max sep.)
  79.       Chnl Vol: Volume for each channel. Ranges from 0->64
  80.       Chnl Pan: Each byte contains a panning value for a channel. Ranges from
  81.                  0 (absolute left) to 64 (absolute right). 32 = central pan,
  82.                  100 = Surround sound.
  83.                  +128 = disabled channel (notes will not be played, but note
  84.                                           that effects in muted channels are
  85.                                           still processed)
  86.       Orders:   This is the order in which the patterns are played.
  87.                  Valid values are from 0->199.
  88.                  255 = "---", End of song marker
  89.                  254 = "+++", Skip to next order
  90.  
  91.  
  92.                   Old Impulse Instrument Format (cmwt < 200h)
  93.  
  94.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  95.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  96. 0000: │'I'│'M'│'P'│'I'│ DOS FileName (12345678.123)                   │
  97.       ├───┼───┼───┼───┼───┬───┬───┬───┬───────┬───┬───┬───────┬───┬───┤
  98. 0010: │00h│Flg│VLS│VLE│SLS│SLE│ x │ x │FadeOut│NNA│DNC│TrkVers│NoS│ x │
  99.       ├───┴───┴───┴───┴───┴───┴───┴───┴───────┴───┴───┴───────┴───┴───┤
  100. 0020: │ Instrument Name, max 26 bytes, includes NUL...................│
  101.       ├───────────────────────────────────────┬───┬───┬───┬───┬───┬───┤
  102. 0030: │.......................................│ x │ x │ x │ x │ x │ x │
  103.       ├───────────────────────────────────────┴───┴───┴───┴───┴───┴───┤
  104. 0040: │ Note-Sample/Keyboard Table, Length = 240 bytes................│
  105.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  106.  
  107.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  108. 0130: │ Volume envelope (200 bytes)...................................│
  109.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  110.  
  111.                                       ├───┴───┴───┴───┴───┴───┴───┴───┤
  112. 01F8:                                 │ Node points (25x2 bytes)......│
  113.                                       └───────────────────────────────┘
  114.  
  115.         Total length of old instrument header is 554 bytes.
  116.  
  117.       Flg:      Bit 0. On = Use volume envelope
  118.                 Bit 1. On = Use volume loop
  119.                 Bit 2. On = Use sustain volume loop
  120.       VLS:      Volume loop start (node number)
  121.       VLE:      Volume loop end (node number)
  122.       SLS:      Sustain loop start (node number)
  123.       SLE:      Sustain loop end (node number)
  124.       FadeOut:  Ranges between 0 and 64, but the fadeout "Count" is 512.
  125.                 See the Last section on how this works.
  126.                 Fade applied when:
  127.                 1) Note fade NNA is selected and triggered (by another note)
  128.                 2) Note off NNA is selected with no volume envelope
  129.                    or volume envelope loop
  130.                 3) Volume envelope end is reached
  131.  
  132.       DNC:      Duplicate note check (0 = Off, 1 = On)
  133.       NNA:      New note action:
  134.                         0 = Note cut
  135.                         1 = Note continue
  136.                         2 = Note off
  137.                         3 = Note fade
  138.  
  139.       TrkVers:  Tracker version used to save the instrument. This is only
  140.                 used in the instrument files.
  141.       NoS:      Number of samples associated with instrument. This is only
  142.                 used in the instrument files.
  143.  
  144.       Note-Sample/Keyboard Table.
  145.        Each note of the instrument is first converted to a sample number
  146.        and a note (C-0 -> B-9). These are stored as note/sample pairs
  147.        (note first, range 0->119 for C-0 to B-9, sample ranges from
  148.        1-99, 0=no sample)
  149.  
  150.        Volume envelope: Values from 0->64, 0FFh indicating end of envelope.
  151.        (after which note fade applies)
  152.  
  153.       Node data: Tick THEN magnitude
  154.  
  155.  
  156.  
  157.                            Impulse Instrument Format
  158.  
  159.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  160.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  161. 0000: │'I'│'M'│'P'│'I'│ DOS FileName (12345678.123)                   │
  162.       ├───┼───┼───┼───┼───────┬───┬───┬───┬───┬───┬───┬───────┬───┬───┤
  163. 0010: │00h│NNA│DCT│DCA│FadeOut│PPS│PPC│GbV│DfP│ x │ x │TrkVers│NoS│ x │
  164.       ├───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┴───┴───────┴───┴───┤
  165. 0020: │ Instrument Name, max 26 bytes, includes NUL...................│
  166.       ├───────────────────────────────────────┬───┬───┬───┬───┬───┬───┤
  167. 0030: │.......................................│ x │ x │ x │ x │ x │ x │
  168.       ├───────────────────────────────────────┴───┴───┴───┴───┴───┴───┤
  169. 0040: │ Note-Sample/Keyboard Table, Length = 240 bytes................│
  170.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  171.  
  172.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  173. 0130: │ Envelopes.....................................................│
  174.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  175.  
  176.         NNA = New Note Action
  177.                 0 = Cut                 1 = Continue
  178.                 2 = Note off            3 = Note fade
  179.  
  180.         DCT = Duplicate Check Type
  181.                 0 = Off                 1 = Note
  182.                 2 = Sample              3 = Instrument
  183.  
  184.         DNA: Duplicate Check Action
  185.                 0 = Cut
  186.                 1 = Note Off
  187.                 2 = Note fade
  188.  
  189.       FadeOut:  Ranges between 0 and 128, but the fadeout "Count" is 512.
  190.                 See the Last section on how this works.
  191.                 Fade applied when:
  192.                 1) Note fade NNA is selected and triggered (by another note)
  193.                 2) Note off NNA is selected with no volume envelope
  194.                    or volume envelope loop
  195.                 3) Volume envelope end is reached
  196.  
  197.         PPS: Pitch-Pan separation, range 0->64, &128 => Don't use
  198.         PPC: Pitch-Pan center: C-0 to B-9 represented as 0->119 inclusive
  199.  
  200.         GbV: Global Volume, 0->128
  201.         DfP: Default Pan, 0->64, &128 => Don't use
  202.  
  203.       TrkVers:  Tracker version used to save the instrument. This is only
  204.                 used in the instrument files.
  205.       NoS:      Number of samples associated with instrument. This is only
  206.                 used in the instrument files.
  207.  
  208.       Note-Sample/Keyboard Table.
  209.        Each note of the instrument is first converted to a sample number
  210.        and a note (C-0 -> B-9). These are stored as note/sample pairs
  211.        (note first, range 0->119 for C-0 to B-9, sample ranges from
  212.        1-99, 0=no sample)
  213.  
  214.                                 Envelope layout
  215.  
  216.         Envelopes: 3 structures, first for volume (130h), second for
  217.                    panning (182h), third for pitch (1D4h).
  218.  
  219.                    Each is structured as such:
  220.  
  221.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E
  222.       ┌───┬───┬───┬───┬───┬───┬───────────────────────────────────┬───┐
  223. xxxx: │Flg│Num│LpB│LpE│SLB│SLE│ Node points, 25 sets, 75 bytes....│ x │
  224.       ├───┼───┼───┼───┼───┼───┼───┬───┬───┬───┬───┬───┬───┬───┬───┼───┤
  225.  
  226.         Flg: Bit 0: Envelope on/off, 1 = on, 0 = off
  227.              Bit 1: Loop on/off, 1 = on, 0 = off
  228.              Bit 2: SusLoop on/off, 1 = on, 0 = off
  229.  
  230.         Num = Number of node points
  231.  
  232.         LpB = Loop beginning            SLB = Sustain loop beginning
  233.         LpE = Loop end                  SLE = Sustain loop end
  234.  
  235.         Node point = 1 byte for y-value
  236.                         (0->64 for vol, -32->+32 for panning or pitch)
  237.                      1 word (2 bytes) for tick number (0->999)
  238.  
  239.         Total length of an instrument is 547 bytes, but 554 bytes are
  240.         written, just to simplify the loading of the old format. (Hence
  241.         there are 7 'wasted' bytes per instrument)
  242.  
  243.  
  244.  
  245.                              Impulse Sample Format
  246.  
  247.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  248.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  249. 0000: │'I'│'M'│'P'│'S'│ DOS Filename (12345678.123)                   │
  250.       ├───┼───┼───┼───┼───────────────────────────────────────────────┤
  251. 0010: │00h│GvL│Flg│Vol│ Sample Name, max 26 bytes, includes NUL.......│
  252.       ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤
  253. 0020: │.......................................................│ x │ x │
  254.       ├───────────────┬───────────────┬───────────────┬───────┴───┴───┤
  255. 0030: │ Length        │ Loop Begin    │ Loop End      │ C5Speed       │
  256.       ├───────────────┼───────────────┼───────────────┼───┬───┬───┬───┤
  257. 0040: │ SusLoop Begin │ SusLoop End   │ SamplePointer │ViS│ViD│ViR│ViT│
  258.       └───────────────┴───────────────┴───────────────┴───┴───┴───┴───┘
  259.  
  260. The cache file has the following pieces of information added on:
  261.  
  262.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  263.       ┌───────────────┬───────┬───────┬───┬───────────────────────────┐
  264. 0050: │ File Size     │ Date  │ Time  │Fmt│...........................│
  265.       └───────────────┴───────┴───────┴───┴───────────────────────────┘
  266.  
  267.         Fmt. 0 = unchecked. 1 = directory, 2 = it sample, 3 = st sample
  268.  
  269.  
  270.       GvL:      Global volume for instrument, ranges from 0->64
  271.       Flg:      Bit 0. On = sample associated with header.
  272.                 Bit 1. On = 16 bit, Off = 8 bit.
  273.                 Bit 2. On = stereo, Off = mono. Stereo samples not supported yet
  274.                 Bit 3. Reserved
  275.                 Bit 4. On = Use loop
  276.                 Bit 5. On = Use sustain loop
  277.                 Bit 6. On = Ping Pong loop, Off = Forwards loop
  278.                 Bit 7. On = Ping Pong Sustain loop, Off = Forwards Sustain loop
  279.       Vol:      Default volume for instrument
  280.  
  281.       Length:   Length of sample in no. of samples NOT no. of bytes
  282.       LoopBeg:  Start of loop (no of samples in, not bytes)
  283.       Loop End: Sample no. AFTER end of loop
  284.       C5Speed:  Number of bytes a second for C-5 (ranges from 0->9999999)
  285.       SusLBeg:  Start of sustain loop
  286.       SusLEnd:  Sample no. AFTER end of sustain loop
  287.  
  288.       SmpPoint: 'Long' Offset of sample in file.
  289.  
  290.       ViS:      Vibrato Speed, ranges from 0->64
  291.       ViD:      Vibrato Depth, ranges from 0->64
  292.       ViT:      Vibrato waveform type.
  293.                         0=Sine wave
  294.                         1=Ramp down
  295.                         2=Square wave
  296.                         3=Random (speed is irrelevant)
  297.       ViR:      Vibrato Rate, rate at which vibrato is applied (0->64)
  298.  
  299.         The depth of the vibrato at any point is worked out in the following
  300.         way:
  301.           Every processing cycle, the following occurs:
  302.                 1) Mov AX, [SomeVariableNameRelatingToVibrato]
  303.                 2) Add AL, Rate
  304.                 3) AdC AH, 0
  305.                 4) AH contains the depth of the vibrato as a fine-linear slide.
  306.                 5) Mov [SomeVariableNameRelatingToVibrato], AX  ; For the next
  307.                                                                 ; cycle.
  308.  
  309.         For those that don't understand assembly, then the depth is
  310.         basically the running-sum of the rate divided by 256.
  311.  
  312.         Sample vibrato uses a table 256-bytes long
  313.  
  314.    Note: The sample load routine uses bytes the at 2Eh and 2Fh for conversion
  315.          flags! So DON'T write anything there!
  316.  
  317.          All samples are UNSIGNED (even 16-bit ones)
  318.  
  319.  
  320.  
  321.                              Impulse Pattern Format
  322.  
  323.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  324.       ┌───────┬───────┬───┬───┬───┬───┬───────────────────────────────┐
  325. 0000: │Length │ Rows  │ x │ x │ x │ x │ Packed data................   │
  326.       ├───┬───┼───┬───┼───┼───┼───┼───┼───┬───┬───┬───┬───┬───┬───┬───┤
  327.  
  328.       Length:   Length of packed pattern, not including the 8 byte header
  329.                 Note that the pattern + the 8 byte header will ALWAYS
  330.                 be less than 64k
  331.       Rows:     Number of rows in this pattern (Ranges from 32->200)
  332.  
  333.       Patterns are unpacked by the following pseudocode... (this may look
  334.       horrible, but in practise, it's just as conveninent as the S3M
  335.       pattern format for playback (but not for display))
  336.  
  337.       GetNextChannelMarker:
  338.         Read byte into channelvariable.
  339.         if(channelvariable = 0) then end of row
  340.         Channel = (channelvariable-1) & 63              ; Channel is 0 based.
  341.         if(channelvariable & 128) then read byte into maskvariable
  342.           else maskvariable = previousmaskvariable for current channel
  343.  
  344.         if(maskvariable & 1), then read note. (byte value)
  345.                 // Note ranges from 0->119 (C-0 -> B-9)
  346.                 // 255 = note off, 254 = notecut
  347.  
  348.         if(maskvariable & 2), then read instrument (byte value)
  349.                 // Instrument ranges from 1->99
  350.  
  351.         if(maskvariable & 4), then read volume/panning (byte value)
  352.                 // Volume ranges from 0->64
  353.                 // Panning ranges from 0->64, mapped onto 128->192
  354.  
  355.         if(maskvariable & 8), then read command (byte value) and commandvalue
  356.                 // Valid ranges from 0->31 (0=no effect, 1=A, 2=B, 3=C, etc.)
  357.  
  358.         if(maskvariable & 16), then note = lastnote for channel
  359.         if(maskvariable & 32), then instrument = lastinstrument for channel
  360.         if(maskvariable & 64), then volume/pan = lastvolume/pan for channel
  361.         if(maskvariable & 128), then {
  362.                 command = lastcommand for channel and
  363.                 commandvalue = lastcommandvalue for channel
  364.         }
  365.         Goto GetNextChannelMarker
  366.  
  367.  
  368.  
  369.                                   Mathematics
  370.  
  371. Abbreviations:
  372.  FV = Final Volume (Ranges from 0 to 128). In versions 1.04+, mixed output
  373.       devices are reduced further to a range from 0 to 64 due to lack of
  374.       memory.
  375.  Vol = Volume at which note is to be played. (Ranges from 0 to 64)
  376.  SV = Sample Volume (Ranges from 0 to 64)
  377.  CV = Channel Volume (Ranges from 0 to 64)
  378.  GV = Global Volume (Ranges from 0 to 128)
  379.  VEV = Volume Envelope Value (Ranges from 0 to 64)
  380.  
  381. In Sample mode, the following calculation is done:
  382.  FV = Vol * SV * CV * GV / 262144               ; Note that 262144 = 2^18
  383.                                                 ; So bit shifting can be done.
  384.  
  385. In Instrument mode the following procedure is used:
  386.  
  387.  1) Update volume envelope value. Check for loops / end of envelope.
  388.  2) If end of volume envelope (ie. position >= 200 or VEV = 0FFh), then turn
  389.         on note fade.
  390.  3) If notefade is on, then NoteFadeComponent (NFC) = NFC - FadeOut
  391.         ; NFC should be initialised to 512 when a note is played.
  392.  4) FV = Vol * SV * CV * GV * VEV * NFC / 8589934592
  393.                                                 ; Note that 8589934592 = 2^33
  394.  
  395. Linear slides work like this:
  396.  Final frequency = Original frequency * 2^(SlideValue/768)
  397.  
  398. (I used a lookup table for the multipliers here)
  399.  
  400. For command Exx, SlideValue = -4*EffectValue
  401. For command EEx, SlideValue = -EffectValue
  402. For command Fxx, SlideValue = 4*EffectValue
  403. For command FEx, SlideValue = EffectValue
  404.  
  405. Note that sample vibrato always uses Linear slides.
  406.  
  407. Notes about effects (as compared to other module formats)
  408.  
  409. C               This is now in *HEX*. (Used to be in decimal in ST3)
  410. E/F/G/H/U       You need to check whether the song uses Amiga/Linear slides.
  411. H/U             Vibrato in Impulse Tracker is two times finer than in
  412.                 any other tracker and is updated EVERY tick.
  413.                 If "Old Effects" is *ON*, then the vibrato is played in the
  414.                 normal manner (every non-row tick and normal depth)
  415. E/F/G           These commands ALL share the same memory.
  416. Oxx             Offsets to samples are to the 'xx00th' SAMPLE. (ie. for
  417.                 16 bit samples, the offset is xx00h*2)
  418.                 Oxx past the sample end will be ignored, unless "Old Effects"
  419.                 is ON, in which case the Oxx will play from the end of the
  420.                 sample.
  421. Yxy             This uses a table 4 times larger (hence 4 times slower) than
  422.                 vibrato or tremelo. If the waveform is set to random, then
  423.                 the 'speed' part of the command is interpreted as a delay.
  424.  
  425. If you read through this document and there are ANY points which you have
  426. troubles with (and have to try out), then let me know - because someone
  427. else will have the same questions - and I'd like to make this DOC as easy
  428. to understand as possible.
  429.  
  430.                                   General Info
  431.  
  432. The player in Impulse Tracker 'allocates' channels to notes whenever they
  433. are *PLAYED*. In sample mode, the allocation is simple:
  434.                         Virtual Channel = 'Host' channel
  435.  
  436. In instrument mode, the following procedure is used:
  437.  
  438.     Check if channel is already playing ---Yes--> set 'background' flag on.
  439.                 |                                 'Trigger' NNA. If NNA=cut,
  440.                 No                                then use this virtual
  441.                 |                                 channel.
  442.                 |                                          |
  443.                 |<------------------ else -----------------/
  444.                 |
  445.                 v
  446.     Search and find the first non-active virtual channel.
  447.                 |
  448.     Non-active channel found? ----Yes----> Use this for playback.
  449.                 |
  450.                 No
  451.                 |
  452.                 v
  453.    Search through and find the channel of lowest volume that is in the
  454.    'background' (ie. no longer controlled directly)
  455.                 |
  456.    Background channel found? ----Yes----> Use this for playback.
  457.                 |
  458.                 No
  459.                 |
  460.                 v
  461.    Return error - the note is *NOT* allocated a channel, and hence is not
  462.    played.
  463.  
  464.    Actually, this is quite a simple process... just that it's another of
  465.    those 'hassles' to have to write...
  466.